import pandas as pd
import numpy as np

# 数据合并
# -- pd.concat()
# -- pd.merge()
# -- pd.append()

def make_df(cols, ind):
    data = [[str(c) + str(i) for i in ind] for c in cols]
    df = pd.DataFrame(data, index=ind, columns=cols)
    return df


# pd.concat函数，与np.concatenate类似，用于合并多个DataFrame或Series。
# 语法：pd.concat(objs, axis=0, join='outer', join_axes=None, ignore_index=False, keys=None, levels=None, names=None, verify_integrity=False, copy=True)
# 参数：
# - objs：一个列表，包含多个DataFrame或Series。
# - axis：合并轴，0表示行合并，1表示列合并。
print("\n1.使用pd.concat()级联")
df2 = make_df(list('AB'),[1,2])
df3 = make_df(list('AB'),[3,4])
print(df2)
print(df3)
df4 = pd.concat([df2,df3])  # 默认axis=0，行合并，上下合并
print(df4)
df5 = pd.concat([df2,df3],axis=1)  # axis=1，列合并，左右合并
print(df5)
print('\n忽略行索引ignore_index=True')
df6 = pd.concat([df2,df3],ignore_index=True) # 忽略行索引,重置索引
print(df6)
print('\n设置多层索引keys')
df7 = pd.concat([df2,df3],keys=['x','y']) # 设置行索引层级，默认axis=0
print(df7)
df8 = pd.concat([df2,df3],keys=['x','y'],axis=1) # 设置列索引层级，axis=1
print(df8)

# 2.不匹配级联：指的是级联的维度的索引不一致，例如纵向级联列索引不一致，横向级联行索引不一致。
df11 = make_df(list('ABCD'),[1,2,3,4])
df12 = make_df(list('DEFG'),[4,5,6,7])
print(df11)
print(df12)
print("\n2.不匹配级联")
# 外连接：补NAN值，保留所有索引，类似于并集，显示所有数据
print(pd.concat([df11,df12]))
print(pd.concat([df11,df12],join='outer'))

# 内连接：仅保留匹配的索引，类似于交集，显示匹配的数据
print('\n3.内连接')
print(pd.concat([df11,df12],join='inner'))

